; Компиляция и запись на виртуальный диск для тестирования
; fasm moon.asm && ./update moon.bin flash.img && bochs -f boot.bxrc -q

    include 'lib/macros.asm'    ; Макросы
    include 'lib/variables.asm' ; Указатели на фиксированные переменные'

; Начало кода здесь 0:0xC000
    
    org 0xC000

    cli
    cld
    call create_initial_gdt     ; Создание первичных дескрипторов [lib/rmode.asm]    
    pm_jump                     ; Переходим в "Protected Mode" (защищенный режим)

    include 'lib/rmode.asm'    

    ; Отдел системного VM
    ; Необходимо для вызова функции BIOS
    ; ----------------------------------
VM: brk
    jmp $

; Само ядро начинается с этого адреса. Предыдущий код становится недоступным
; ==========================================================================================
PROTECTED_MODE_CODE:
; ==========================================================================================

    org 0
    use32    

    pm_init    
    irq_redirect 1110111111111000b ; Переброс IRQ (PIC) и установка маски [lib/bootstrap.asm]

    call CLEAR_memory ; Очистить системную память
    call INT_setup  ; Инициализация всех системных прерываний [lib/bootstrap.asm]  
    call PS2_mouse  ; Инициализация мыши
    call TIMER_init ; 100 Hz системный таймер

    ; invoke MAX_memory 0 ; Расчет максимально доступной памяти
    ; invoke PAGING_init 0 ; Простановка Paging (по размеру памяти)

    ; Основные задачи
    task_create_0 TASK_main,  TSS_general, TC   ; Создание задачи ядра (TSS=0x28)
    task_create_0 TASK_timer, TSS_timer, IRQ_0  ; Создание задачи таймера [lib/irq.asm]

    ; Создание задачи VM и инициализация сегментов и указателей
    task_create_0 TASK_vm, TSS_VM, 0 
    call VM_initialize

    ; Определение жестких дисков через IDENTIFY и их перечисление
    call ATA_init_devices

;brk

    ; Установка VGA-видеорежима 640 x 480 x 16
    mov ax, 0x0012
    int 0x30

    ; тестовое рисование
    invk5 VGA_rectangle, 0, 0, 320, 240, 7
    invk5 VGA_rectangle, 1, 1, 320-1, 10, 1
    
    ; Включаем многозадачность
    ; Сегмент 0x28 становится Busy 32bit TSS
    load_task TASK_main

    ; Прерывания включаются в самом конце
    sti

    ; --------------------------------------

    ; бесконечный цикл
TC: jmp TC

; Функции для оболочки
; ------------------------------------------------------------------------------------------

    include 'lib/loader.asm'  ; Загрузчик кода
    include 'lib/data.asm'    ; Данные